import { AxiosResponse } from "axios";
import { post, get, put } from "./request";
import { ILoginRequest, ILoginResponse } from "../types/requestType";
import { IUserData } from "../types/userDataType";
import { TUpdateUser } from "../types/updateUserType";

/**
 * Объект с запросами.
 * @type {{
 *  login: (body: ILoginRequest) => Promise<ILoginResponse>;
 *  refresh: () => Promise<ILoginResponse>;
 *  logout: () => Promise<AxiosResponse<any, any>>;
 *  getProfile: () => Promise<IUserData>;
 *   updateUser: (body: TUpdateUser) => Promise<IUserData>;
 * }}
 */
const authServices = {
    /**
     * @async
     * @function login - Функция для выполнения входа пользователя.
     * @param { ILoginRequest } body - Данные для входа.
     * @returns { Promise<ILoginResponse } - Access токен.
     */
    login: async (body: ILoginRequest): Promise<ILoginResponse> => post('/api/auth/login', body),
    /**
     * @async
     * @function refresh - Функция для обновления токена авторизации.
     * @returns { Promise<ILoginResponse } - Access токен.
     */
    refresh: async (): Promise<ILoginResponse> => post('/api/auth/refresh'),
    /**
     * @async
     * @function logout - Функция для выхода пользователя.
     * @returns { Promise<AxiosResponse<any, any>> } - Ответ сервера.
     */
    logout: async (): Promise<AxiosResponse<any, any>> => post('/api/auth/logout'),
    /**
     * @async
     * @function getProfile - Функция для получения профиля пользователя.
     * @returns { Promise<IUserData> } - Данные профиля пользователя.
     */
    getProfile: async (): Promise<IUserData> => (await get('/api/auth/profile')).data,
    /**
     * @async
     * @function updateUser - Функция для редактирования данных профиля пользователя.
     * @param { TUpdateUser } body - Данные пользователя для обновления.
     * @returns { Promise<IUserData> } - Обновленные данные пользователя.
     */
    updateUser: async (body: TUpdateUser): Promise<IUserData> => {
        const profile = await put('/api/auth/me', body, {
            headers: {
                "Content-Type": "application/json"
            }
        });
        return profile.data;
    }
}

export default authServices;